package com.fruit.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.commons.lang3.StringUtils;

/**时间工具类
 * @author Administrator 说明：日期处理 创建人：FH Q313596790 
 * @version 2017.12.01 11:40
 */
public class DateUtil {

	private  static final SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
	private  static final SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy-MM-dd");
	private  static final SimpleDateFormat sdfYearM = new SimpleDateFormat("yyyy-MM");
	private  static final SimpleDateFormat sdfDays = new SimpleDateFormat("yyyyMMdd");
	private  static final SimpleDateFormat sdfDaymd = new SimpleDateFormat("yyyy.MM.dd");
	private  static final SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	private  static final SimpleDateFormat sdfTimes = new SimpleDateFormat("yyyyMMddHHmmss");
	private  static final SimpleDateFormat hmsTimes = new SimpleDateFormat("HHmmss");
	private  static final SimpleDateFormat hmsTimes1 = new SimpleDateFormat("HH:mm:ss");
	private  static final SimpleDateFormat chTime = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
	private  static final SimpleDateFormat chandEngTime = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
	private  static final SimpleDateFormat smsTime = new SimpleDateFormat("MM月dd日 HH:mm");
	public static final int ONE_DAY_MILLISECOND = 86400000;
	public static final long ONE_HOUR_MILLISECOND = 3600000;
	public static final int FORMAT_DAY = 0;
	public static final int FORMAT_TIME = 1;

	/**
	 * getCurDate
	 * @return 返回Date
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static Date getCurDate() {
		return new Date();
	}

	/**
	 * 获取YYYY格式
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getSdfTimes() {
		return sdfTimes.format(new Date());
	}

	/**
	 * 获取yyyy-MM格式
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getsdfYearMTimes() {
		return sdfYearM.format(new Date());
	}

	/**
	 * 获取YYYY格式
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getYear() {
		return sdfYear.format(new Date());
	}

	/**
	 * 获取YYYY-MM-DD格式
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getDay() {
		return sdfDay.format(new Date());
	}

	/**
	 * 获取YYYYMMDD格式
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getDays() {
		return sdfDays.format(new Date());
	}

	/**
	 * 获取YYYY-MM-DD HH:mm:ss格式
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getTime() {
		return sdfTime.format(new Date());
	}
	/**
	 * 获取当前时间+增量（年）后的时间YYYY-MM-DD HH:mm:ss格式
	 * @param inc 年增量（可以为负数）
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getTimeByInc(int inc) {
		Calendar now = Calendar.getInstance();
		now.add(Calendar.YEAR, inc);
		return sdfTime.format(now.getTime());
	}

	/**
	 * 获取HH:mm:ss格式
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getHMS() {
		return hmsTimes1.format(new Date());
	}

	/**
	 * 获取HHmmss格式
	 * @return long
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static long getHsmTime() {
		return Long.parseLong(hmsTimes.format(new Date()));
	}

	/**
	 * 获取yyyy.MM.dd格式
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getsdfDaymd() {
		return sdfDaymd.format(new Date());
	}

	/**
	 * @Title: compareDate
	 * @Description: TODO(日期比较，如果s>=e 返回true 否则返回false)
	 * @param s s
	 * @param e e
	 * @return boolean
	 * @throws @author
	 *             fh
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static boolean compareDate(String s, String e) {
		if (StringUtils.isEmpty(s) || StringUtils.isEmpty(e)) {
			return false;
		}

		if (fomatDate(s) == null || fomatDate(e) == null) {
			return false;
		}
		return fomatDate(s).getTime() >= fomatDate(e).getTime();
	}

	/**
	 * @Title: compareDate
	 * @Description: TODO(日期比较，如果s>=e 或者为空 返回true 否则返回false)
	 * @param s s
	 * @param e e
	 * @return boolean
	 * @throws @author
	 *             fh
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static boolean compareDate2(String s, String e) {
		if (StringUtils.isEmpty(s) || StringUtils.isEmpty(e)) {
			return true;
		}

		if (fomatDateTime(s) == null || fomatDateTime(e) == null) {
			return true;
		}
		return fomatDateTime(s).getTime() >= fomatDateTime(e).getTime();
	}

	/**
	 * @Title: compareDate
	 * @Description: TODO(日期比较，如果s>=e 或者为空 返回true 否则返回false)
	 * @param s s
	 * @param e e 
	 * @return boolean
	 * @throws @author
	 *             fh
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static boolean compareDateHMS(String s, String e) {
		if (StringUtils.isEmpty(s) || StringUtils.isEmpty(e)) {
			return true;
		}

		if (fomatDateHMS(s) == null || fomatDateHMS(e) == null) {
			return true;
		}
		return fomatDateHMS(s).getTime() >= fomatDateHMS(e).getTime();
	}

	/**
	 * 格式化日期
	 * @param date date
	 * @return Date
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static Date fomatDate(String date) {
		DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
		try {
			return fmt.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 格式化日期yyyy-MM-dd HH:mm:ss
	 * @param date date
	 * @return Date
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static Date fomatDateToY(String date) {
		DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			return fmt.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 格式化yyyy年MM月dd日 转化 yyyy.MM.dd格式
	 * @param date date
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String dateTime(String date) {
		DateFormat fmt = new SimpleDateFormat("yyyy.MM.dd");
		DateFormat fmtDate = new SimpleDateFormat("yyyy年MM月dd日");
		try {
			return fmt.format(fmtDate.parse(date));
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}

	}
	/**
	 * 格式化yyyy.MM.dd 转化 yyyy年MM月dd日格式
	 * @param date date
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String dateTimeToYYD(String date) {
		DateFormat fmt = new SimpleDateFormat("yyyy年MM月dd日");
		DateFormat fmtDate = new SimpleDateFormat("yyyy.MM.dd");
		try {
			return fmt.format(fmtDate.parse(date));
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}

	}
	/**
	 * 格式化YYYY-MM-DD HH:MM:SS转化为 yyyy.MM.dd
	 * @param date date
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String yMdhmsToYmd(String date) {
		DateFormat fmt = new SimpleDateFormat("yyyy.MM.dd");
		DateFormat fmtDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			return fmt.format(fmtDate.parse(date));
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}
	/**
	 * 格式化yyyy年MM月dd日转化为 yyyy-MM-dd
	 * @param date date
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String yMdhms(String date) {
		DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
		DateFormat fmtDate = new SimpleDateFormat("yyyy年MM月dd日");
		try {
			return fmt.format(fmtDate.parse(date));
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}

	}
	/**
	 * 格式化日期 HH:mm:ss格式
	 * @param date date
	 * @return Date
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static Date fomatDateHMS(String date) {
		DateFormat fmt = new SimpleDateFormat("HH:mm:ss");
		try {
			return fmt.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 格式化yyyy-MM-dd HH:mm:ss转化为 yyyy年MM月dd日 格式
	 * @param date date
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String yMdHmsToCh(String date) {
		DateFormat fmt = new SimpleDateFormat("yyyy年MM月dd日");
		DateFormat fmtDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			return fmt.format(fmtDate.parse(date));
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 格式化yyyy-MM-dd转化为 yyyy年MM月dd日 格式
	 * @param date date
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String ChTime(String date) {
		DateFormat fmt = new SimpleDateFormat("yyyy年MM月dd日");
		DateFormat fmtDate = new SimpleDateFormat("yyyy-MM-dd");
		try {
			return fmt.format(fmtDate.parse(date));
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}

	}

	/**
	 * 格式化yyyy年MM月dd日转化 yyyy-MM-dd 格式
	 * @param date date
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String dTime(String date) {
		DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
		DateFormat fmtDate = new SimpleDateFormat("yyyy年MM月dd日");
		try {
			return fmt.format(fmtDate.parse(date));
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}

	}

	/**
	 * 格式化yyyy-MM-dd转化 yyyy.MM.dd 格式
	 * @param date date
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String yMdToYmd(String date) {
		DateFormat fmt = new SimpleDateFormat("yyyy.MM.dd");
		DateFormat fmtDate = new SimpleDateFormat("yyyy-MM-dd");
		try {
			return fmt.format(fmtDate.parse(date));
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}

	}

	/**
	 * 格式化中文格式日期 年月日 格式
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getChTime() {
		DateFormat fmt = new SimpleDateFormat("yyyy年MM月dd日");
		return fmt.format(new Date());
	}

	/**
	 * 格式化中文格式日期 年月日 时分秒格式
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getChinaTime() {
		return chTime.format(new Date());
	}
	/**
	 * yyyy年MM月dd日 HH:mm
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getChandEngTime() {
		return chandEngTime.format(new Date());
	}
	/**
	 * 格式化中文格式日期 月日 时:分
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getSmsTime() {
		return smsTime.format(new Date());
	}


	/**
	 * 格式化日期 YYYY-MM-DD HH:mm:ss格式
	 * @param date date
	 * @return Date
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static Date fomatDateTime(String date) {
		try {
			return sdfTime.parse(date);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * fomatDateTime
	 * @param date date
	 * @param format format
	 * @return Date
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static Date fomatDateTime(String date, String format) {
		DateFormat fmt = new SimpleDateFormat(format);
		try {
			return fmt.parse(date);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * fomatDateTime
	 * @param date date
	 * @param format format
	 * @param toFormat toFormat
	 * @return Date
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String fomatDateTime(String date, String format, String toFormat) {
		DateFormat fmt = new SimpleDateFormat(format);
		DateFormat tofmt = new SimpleDateFormat(toFormat);
		try {
			return tofmt.format(fmt.parse(date));
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * fomatTimeMillis
	 * @param date date
	 * @param format format
	 * @return Long
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static Long fomatTimeMillis(String date, String format) {
		DateFormat fmt = new SimpleDateFormat(format);
		try {
			return fmt.parse(date).getTime();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * fomatDateTime
	 * @param date date
	 * @param fmt fmt
	 * @return Date
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static Date fomatDateTime(String date, DateFormat fmt) {
		try {
			return fmt.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 校验日期是否合法
	 * @param s s
	 * @return boolean
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static boolean isValidDate(String s) {
		DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
		try {
			fmt.parse(s);
			return true;
		} catch (Exception e) {
			// 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
			return false;
		}
	}

	/**getDiffYear
	 * @param startTime startTime
	 * @param endTime endTime
	 * @return int
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static int getDiffYear(String startTime, String endTime) {
		DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
		try {
			// long aa=0;
			int years = (int) (((fmt.parse(endTime).getTime() - fmt.parse(startTime).getTime()) / (1000 * 60 * 60 * 24))
					/ 365);
			return years;
		} catch (Exception e) {
			// 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
			return 0;
		}
	}

	/**
	 * <li>功能描述：时间相减得到天数
	 * @param beginDateStr beginDateStr
	 * @param endDateStr endDateStr
	 * @return long
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static long getDaySub(String beginDateStr, String endDateStr) {
		long day = 0;
		java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");
		java.util.Date beginDate = null;
		java.util.Date endDate = null;

		try {
			beginDate = format.parse(beginDateStr);
			endDate = format.parse(endDateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		day = (endDate.getTime() - beginDate.getTime()) / (24 * 60 * 60 * 1000);
		// System.out.println("相隔的天数="+day);

		return day;
	}

	/**
	 * 得到n天之后的日期
	 * @param days days
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getAfterDayDate(int days) {

		Calendar canlendar = Calendar.getInstance(); // java.util包
		canlendar.add(Calendar.DATE, days); // 日期减 如果不够减会将月变动
		Date date = canlendar.getTime();

		SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dateStr = sdfd.format(date);

		return dateStr;
	}

	/**
	 * getAfterDayDate
	 * @param strDate strDate
	 * @param days days
	 * @param format format
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getAfterDayDate(String strDate, int days, int format) {

		DateFormat df = getDateFormat(format);
		Date d = getFormatedDate(df, strDate);

		Calendar c = new GregorianCalendar();
		c.setTime(d);
		c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) + days);
		return df.format(c.getTime());
	}

	/**
	 * 得到n天之后是周几
	 * @param days days
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String getAfterDayWeek(String days) {
		int daysInt = Integer.parseInt(days);
		Calendar canlendar = Calendar.getInstance(); // java.util包
		canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动
		Date date = canlendar.getTime();
		SimpleDateFormat sdf = new SimpleDateFormat("E");
		String dateStr = sdf.format(date);
		return dateStr;
	}

	/**
	 * 判断时间大小
	 * @param strEndDate strEndDate
	 * @param strStartDate strStartDate
	 * @param format format
	 * @return long
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static long subtractTime(String strEndDate, String strStartDate, String format) {

		DateFormat df = new SimpleDateFormat(format);

		Date endDate = fomatDateTime(strEndDate, df);
		Date startDate = fomatDateTime(strStartDate, df);

		long msEndDate = endDate.getTime();
		long msStartDate = startDate.getTime();

		return (msEndDate - msStartDate);
	}

	/**
	 * subtractTime
	 * @param endDate endDate
	 * @param startDate startDate
	 * @return long
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static long subtractTime(Date endDate, Date startDate) {

		long msEndDate = endDate.getTime();
		long msStartDate = startDate.getTime();

		return (msEndDate - msStartDate);
	}

	private static Date getFormatedDate(DateFormat df, String strDate) {

		try {
			return df.parse(strDate);
		} catch (Exception ex) {
			throw new RuntimeException("日期格式不对，无法解析。", ex);
		}
	}

	private static DateFormat getDateFormat(int format) {
		if (format == 1) {
			return sdfTime;
		} else {
			return sdfDay;
		}

	}

	/**
	 * 将时间转换为时间戳
	 * @param s s
	 * @return String
	 * @throws ParseException 
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String dateToStamp(String s) throws ParseException {
		String res;
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = simpleDateFormat.parse(s);
		long ts = date.getTime();
		res = String.valueOf(ts);
		return res;
	}

	/**
	 * 将时间戳转换为时间
	 * @param s s
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String stampToDate(String s) {
		String res;
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		long lt = new Long(s);
		Date date = new Date(lt);
		res = simpleDateFormat.format(date);
		return res;
	}

	/**
	 * yyyy-MM-dd HH:mm:ss
	 * @param date date
	 * @return String
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static String dateToString(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dates = sdf.format(date);
		return dates;
	}

	/**
	 * daysOfTwo
	 * @param fDate fDate
	 * @param oDate oDate
	 * @return int
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static int daysOfTwo(Date fDate, Date oDate) {

		Calendar aCalendar = Calendar.getInstance();

		aCalendar.setTime(fDate);

		int day1 = aCalendar.get(Calendar.DAY_OF_YEAR);

		aCalendar.setTime(oDate);

		int day2 = aCalendar.get(Calendar.DAY_OF_YEAR);

		return day2 - day1;

	}

}